package com.Gosposia;
import java.awt.EventQueue;

import java.awt.Frame;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.util.Random;

import java.lang.Thread;

import com.Gosposia.Gosposia.ERodzajDania;
import com.Gosposia.Gosposia.EStanGosposi;

public class Dom implements Runnable
{
	private Kuchnia kuchnia;
	private Lazienka lazienka;
	private Pokoj pokoj;
	private Gosposia gosposia;
	private Zegarek zegarek;
	private ClipsParser parser;
	
	private int interwal;
	
	int godzSniadania = 8;
	int godzObiadu = 15;
	int godzKolacji = 19;
	
	MainWindow window;
	
	public boolean czyCzynnikNiedetrministyczny;
	private boolean wyslijFaktNiedeterministyczny;
	private int iloscGosci;
	private Random rand;
	private int tempGodzina, tempMinuta;
	private boolean czyObiadDlaGosci;
	
	public Dom(MainWindow window)
	{
		/*JFileChooser plik = new JFileChooser();		
	    FileNameExtensionFilter filter = new FileNameExtensionFilter("Clips Files","clp");
	    plik.setFileFilter(filter);*/
		
		//int returnValue = plik.showOpenDialog(new Frame());
		//if(returnValue == JFileChooser.APPROVE_OPTION)
		{
			//parser = new ClipsParser(plik.getSelectedFile().getAbsolutePath());
			parser = new ClipsParser("baza_tomekT.CLP");
		}
		
		kuchnia = new Kuchnia();
		lazienka = new Lazienka();
		pokoj = new Pokoj();		
		zegarek = new Zegarek();
		gosposia = new Gosposia(kuchnia, lazienka, pokoj);
		
		interwal = 0;
		
		czyCzynnikNiedetrministyczny = true;
		wyslijFaktNiedeterministyczny = false;
		iloscGosci = 0;
		rand = new Random();
		
		this.window = window;
		
	}
	
	public Dom(MainWindow window, DanePoczatkowe dane)
	{
		JFileChooser plik = new JFileChooser();		
	    FileNameExtensionFilter filter = new FileNameExtensionFilter("Clips Files","clp");
	    plik.setFileFilter(filter);
		
		int returnValue = plik.showOpenDialog(new Frame());
		if(returnValue == JFileChooser.APPROVE_OPTION)
		{
			parser = new ClipsParser(plik.getSelectedFile().getAbsolutePath());
		}
		
		kuchnia = new Kuchnia();
		lazienka = new Lazienka();
		pokoj = new Pokoj();		
		zegarek = new Zegarek();
		gosposia = new Gosposia(kuchnia, lazienka, pokoj);
		
		interwal = 0;
		
		czyCzynnikNiedetrministyczny = true;
		wyslijFaktNiedeterministyczny = false;
		iloscGosci = 0;
		rand = new Random();
		
		this.window = window;
		
		pokoj.czystosc = dane.czystoscPokoju;
		kuchnia.czystosc = dane.czystoscKuchni;
		lazienka.czystosc = dane.czystoscLazienki;
		
		kuchnia.getKoszNaSmieci().iloscSmieci = dane.iloscSmieci;
		kuchnia.getLodowka().iloscProduktow = dane.iloscJedzenia;
		kuchnia.getZmywarka().iloscNaczyn = dane.iloscNaczyn;
		
		lazienka.iloscSrodkowCzystosci = dane.iloscSrodkowCzystosci;
		lazienka.getKoszNaPranie().ilosc = dane.iloscPrania;
		
		
	}
	
	public boolean Update()
	{
		if(zegarek.dzien >= 14)
		{
			return false;
		}
		
		try 
		{
			Thread.currentThread();
			Thread.sleep(10);
		} 
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
		
		zegarek.Update();
		gosposia.Update(zegarek.godzina, zegarek.minuta);
		
		//sprawdzanie czynnika nideterministycznego
		if(czyCzynnikNiedetrministyczny)
		{
			if(zegarek.godzina > 15 && zegarek.godzina < 22 && !wyslijFaktNiedeterministyczny)
			{
				int r = rand.nextInt();
				if(r % 500 == 0)
				{
					wyslijFaktNiedeterministyczny = true;
					tempGodzina = zegarek.godzina;
					tempMinuta = zegarek.minuta;
					iloscGosci++;
				}
				else
				{
					wyslijFaktNiedeterministyczny = false;
				}
			}
		}
		
		if(zegarek.godzina == 23 && zegarek.minuta == 59)
		{
			gosposia.koniecDnia();
		}
		
		//co 10 min
		if(interwal % 10 == 0)
		{
			kuchnia.Update();
			lazienka.Update();
			pokoj.Update();
		}
		
		//co godzine
		if(interwal % 60 == 0)
		{
			lazienka.getKoszNaPranie().ilosc++;
		}
		
		interwal++;
		
		//System.out.println(zegarek.toString());
		
		parser.Reset();
		wyslijDaneCzujnikow();
		parser.Run();
		
		//otrzymaj i wykonaj decyzje
		String czynnosc = parser.getCzynnosc();
		if(gosposia.getStan() == EStanGosposi.WOLNA)
		{
			if(czynnosc.equals("ODPOCZYNEK"))
			{
				gosposia.setStan(EStanGosposi.WOLNA);
			}
			if(czynnosc.equals("GOTOWANIE"))
			{
				String cel = parser.getCel();
				if(cel.equals("SNIADANIE"))
				{
					gosposia.Gotuj(ERodzajDania.SNIADANIE);
				}
				else if(cel.equals("OBIAD"))
				{
					gosposia.Gotuj(ERodzajDania.OBIAD);
				}
				else if(cel.equals("KOLACJA"))
				{
					gosposia.Gotuj(ERodzajDania.KOLACJA);
				}
			}
			if(czynnosc.equals("ZAKUPY"))
			{
				gosposia.ZrobZakupy();
			}
			if(czynnosc.equals("SPRZATANIE"))
			{
				String cel = parser.getCel();
				if(cel.equals("POKOJ"))
				{
					gosposia.Sprzataj(pokoj);
				}
				else if(cel.equals("KUCHNIA"))
				{
					gosposia.Sprzataj(kuchnia);
				}
				else if(cel.equals("LAZIENKA"))
				{
					gosposia.Sprzataj(lazienka);
				}
			}
			if(czynnosc.equals("PRANIE"))
			{
				gosposia.ZrobPranie();
			}
			if(czynnosc.equals("ZMYWANIE"))
			{
				gosposia.PozmywajNaczynia();
			}
			if(czynnosc.equals("SMIECI"))
			{
				gosposia.WyniesSmieci();
			}
		}
		//parser.Destroy();
		
		//updateWindow();
		
		return true;
	}
	
	public void updateWindow()
	{
		window.textField_pokoj_czystosc.setText(String.valueOf(pokoj.czystosc));
		window.textField_lazienka_czystosc.setText(String.valueOf(lazienka.czystosc));
		window.textField_kuchnia_czystosc.setText(String.valueOf(kuchnia.czystosc));
		
		//Kuchnia
		window.textField_smieci.setText(String.valueOf(kuchnia.getKoszNaSmieci().iloscSmieci));
		window.textField_lodowka.setText(String.valueOf(kuchnia.getLodowka().iloscProduktow));
		window.textField_naczynia.setText(String.valueOf(kuchnia.getZmywarka().iloscNaczyn));
		
		//Lazienka
		window.textField_srodki.setText(String.valueOf(lazienka.iloscSrodkowCzystosci));
		window.textField_pranie.setText(String.valueOf(lazienka.getKoszNaPranie().ilosc));
		
		//Zegarek
		window.textField_godzina.setText(String.valueOf(zegarek.godzina));
		window.textField_minuta.setText(String.valueOf(zegarek.minuta));
		window.textField_dzien.setText(String.valueOf(zegarek.dzien));
		
		//Gosposia
		window.textField_zmeczenie.setText(String.valueOf(gosposia.zmeczenie));
		window.textField_czasDoZakonczenia.setText(String.valueOf(gosposia.czasDoZakonczenia));
		window.textField_wynik.setText(String.valueOf(gosposia.miaraJakosci));
		
		window.textField_goscie.setText(String.valueOf(iloscGosci));
		
		window.textField_ilSniadanie.setText(String.valueOf(gosposia.iloscSniadan));
		window.textField_ilObiad.setText(String.valueOf(gosposia.iloscObiadow));
		window.textField_ilKolacja.setText(String.valueOf(gosposia.iloscKolacji));
		
		window.textField_ilSprzPokoj.setText(String.valueOf(gosposia.iloscSprzatanPokoj));
		window.textField_ilSprzKuchnia.setText(String.valueOf(gosposia.iloscSprzatanKuchnia));
		window.textField_ilSprzLazienka.setText(String.valueOf(gosposia.iloscSprzatanLazienka));
		
		window.textField_ilNaczynia.setText(String.valueOf(gosposia.iloscZmywan));
		window.textField_ilPrania.setText(String.valueOf(gosposia.iloscZrobienPrania));
		window.textField_ilSmieci.setText(String.valueOf(gosposia.iloscWyniesienSmieci));
		window.textField_ilZakupow.setText(String.valueOf(gosposia.iloscZrobienZakupow));
		
		window.textArea_console.setText(gosposia.akcja);
		
	}
	
	public void wyslijDaneCzujnikow()
	{
		if(getFakt().length() != 0)
		{
			parser.DodajFakt(getFakt());
		}
		parser.DodajFakt(kuchnia.getFakt());
		parser.DodajFakt(lazienka.getFakt());
		parser.DodajFakt(pokoj.getFakt());
		parser.DodajFakt(zegarek.getFakt());
		parser.DodajFakt(gosposia.getFakt());
		
		if(zegarek.godzina == tempGodzina+1 && zegarek.minuta == tempMinuta)
		{
			wyslijFaktNiedeterministyczny = false;
		}
		
		if(wyslijFaktNiedeterministyczny)
		{
			parser.DodajFakt(przyszliGoscie());
			gosposia.zrobionyObiad = false;
			//System.out.print("goscie");
		}
	}
	
	public String getFakt()
	{
		String posilek = "";
		
		if(zegarek.godzina == godzSniadania && gosposia.zrobioneSniadanie == false)
		{
			posilek = "(posilek sniadanie)";
		}
		
		if(zegarek.godzina == godzObiadu && gosposia.zrobionyObiad == false)
		{
			posilek = "(posilek obiad)";
		}
		
		if(zegarek.godzina == godzKolacji && gosposia.zrobionaKolacja == false)
		{
			posilek = "(posilek kolacja)";
		}
		
		if(posilek.length() != 0)
		{
			String fakt = "(jaki-posilek " + posilek +")";
			return fakt;
		}
		
		return "";
	}
	
	public String przyszliGoscie()
	{
		String fakt = "(jaki-posilek (posilek obiad))";
		return fakt;
	}

	@Override
	public void run() 
	{
		synchronized(window)
		{
		while(this.Update())
		{
			this.updateWindow();
			window.notify();
		}
		}
		
	}
}
